package monopoli.game;

import java.util.ArrayList;
import java.util.Iterator;
import monopoli.Monopoli;
import monopoli.gui.GUI;


public class GameToCommunication implements GameToCommunicationInterface {

    public GameToCommunication () {
    }






    @Override
    public void rifiutaPartecipaPartita(String messaggio) {
        Monopoli.getMonopoliGUI().debugMessage(messaggio);
    }

    @Override
    public void confermaPartecipaPartita(int idOrdine) {

        Partita partita = Monopoli.getMonopoliPartita();
        GUI gui = Monopoli.getMonopoliGUI();
       
        
        gui.debugMessage("Partita confermata id_ordine=" + idOrdine);
        
        partita.ricavaGiocatoreSessione().setIdOrdine(idOrdine);
        gui.confermaPartecipaPartita(idOrdine);
        //partita.setProssimoGiocatore(idOrdine);

        //if(idOrdine == 1)
        //    gui.AggiornaPannelloDiComando("Azione", "InizioTurno");
        //else
        gui.AggiornaPannelloDiComando("Azione", "AttesaTurno");
    }

    @Override
    public void iniziaTurno () {

        if(Monopoli.getMonopoliPartita().ricavaGiocatoreSessione().getPedina().getId() == 0) //CASO è il primo turno di seleziona impostazioni
            Monopoli.getMonopoliGUI().mostraSelezioneNome();
        else    //CASO gestione turno normale
            Monopoli.getMonopoliPartita().inizioTurno();
    }

    @Override
    public void comunicaMovimentoPedina (int pedina,int casella) {
        
        Monopoli.getMonopoliGUI().debugMessage("Comunicazione movimento pedina casella " + casella);
        
        //Trova la pedina e il giocatore
        Giocatore g = null;
        Pedina p = null;
        Iterator it = Monopoli.getMonopoliPartita().getGiocatore().iterator();
        while(it.hasNext()) {
            Giocatore gTmp = (Giocatore)it.next();
            if(gTmp.getPedina().getId() == pedina) {
                g = gTmp;
                p = g.getPedina();
            }
        }

        Casella oldCasella = p.getPosizione();
        p.setPosizione(Monopoli.getMonopoliPartita().getTabellone().getCasella(casella));
        Casella newCasella = p.getPosizione();

        String msg =  g.getNome().toUpperCase() + " AVANZA DA " + oldCasella.getNomeEsteso().toUpperCase() + " A " + newCasella.getNomeEsteso().toUpperCase();
        Monopoli.getMonopoliGUI().appendInfoPlayer(msg);

        //Aggiornamento tabellone
        Monopoli.getMonopoliGUI().muoviPedina(monopoli.gui.Pedina.idToName(pedina), casella);
    }

    @Override
    public void comunicaPedina(int giocatore, int idPedina) {
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        Iterator it = glist.iterator();
        Boolean stop = false;
        Giocatore g = null;
        while (it.hasNext() && stop == false) {
            Object object = it.next();
            g = (Giocatore)object;
            if(g.getId() == giocatore)
                stop = true;
        }
        Pedina p = new Pedina(idPedina);
        g.setPedina(p);
        String nomePedina = monopoli.gui.Pedina.idToName(idPedina);
        Monopoli.getMonopoliGUI().debugMessage("Pedina giocatore " + giocatore + ": " + nomePedina);
        //comunico alla grafica
        Monopoli.getMonopoliGUI().aggiungiPedina(0, nomePedina);

    }

    @Override
    public void comunicaNome(int giocatore, String name) {
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        
        Giocatore g = new Giocatore();
        g.setId(giocatore);
        g.setNome(name);
        glist.add(g);
        Monopoli.getMonopoliGUI().debugMessage("Nome giocatore " + giocatore + ": " + name);

        //aggiorno a video i giocatori

        Iterator it = glist.iterator();
        ArrayList<String> s = new ArrayList<String>();
        while(it.hasNext()) {
            Giocatore g1 = (Giocatore) it.next();
            s.add(g1.getNome());
        }
        Monopoli.getMonopoliGUI().AggiornaSommario("giocatori", s);

    }

    @Override
    public void comunicaPossessoProprieta(int giocatore, int idProprieta) {
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        Iterator it = glist.iterator();
        Boolean stop=false;
        Giocatore g = new Giocatore();
        while (it.hasNext() && stop == false) {
            Object object = it.next();
            g = (Giocatore)object;
            if(g.getId()==giocatore)
                stop=true;
        }

        Proprieta p = (Proprieta)Monopoli.getMonopoliPartita().getMazzoProprieta().getCarta(idProprieta);
        p.setProprietario(giocatore);
        g.getProprieta().add(p);
        Monopoli.getMonopoliGUI().debugMessage("Impostato proprietario " + giocatore + " su proprietà " + idProprieta + " nome: " + p.getNomeEsteso());
    }

    @Override
    public void comunicaAcquistoProprieta (int giocatore,int idProprieta) {
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        Iterator it = glist.iterator();
        Boolean stop=false;
        Giocatore g = new Giocatore();
        while (it.hasNext() && stop == false) {
            Object object = it.next();
            g = (Giocatore)object;
            if(g.getId()==giocatore)
                stop=true;
        }

        Proprieta p = (Proprieta)Monopoli.getMonopoliPartita().getMazzoProprieta().getCarta(idProprieta);
        p.setProprietario(giocatore);
        g.getProprieta().add(p);
        Monopoli.getMonopoliGUI().debugMessage("Impostato proprietario " + giocatore + " su proprietà " + idProprieta + " nome: " + p.getNomeEsteso());
        Monopoli.getMonopoliGUI().appendInfoPlayer( g.getNome().toUpperCase() + " HA ACQUISTATO " + p.getNomeEsteso().toUpperCase());
    }

    @Override
    public void comunicaCostruzioneEdificio (int giocatore, int casella, int edificio) {
        casella--;
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        Iterator it = glist.iterator();
        Boolean stop=false;
        Giocatore g = new Giocatore();
        while (it.hasNext() && stop == false) {
            Object object = it.next();
            g = (Giocatore)object;
            if(g.getId()==giocatore)
                stop=true;
        }
        Terreno t =(Terreno) Monopoli.getMonopoliPartita().getTabellone().getCasella(casella);
        if(edificio == 1) {
            t.getCostruzioni().add(new Casa());
            Monopoli.getMonopoliGUI().aggiungiCasa(++casella);
            Monopoli.getMonopoliGUI().appendInfoPlayer( g.getNome().toUpperCase() + " HA AGGIUNTO UNA CASA SU " + t.getNomeEsteso().toUpperCase());
        }
        else {
            t.getCostruzioni().add(new Albergo());
            Monopoli.getMonopoliGUI().aggiungiHotel(++casella);
            Monopoli.getMonopoliGUI().appendInfoPlayer( g.getNome() + " HA AGGIUNTO UN HOTEL SU " + t.getNomeEsteso().toUpperCase());
        }

    }

    @Override
    public void comunicaPagamento (int amount, int giocatore1, int giocatore2) {

        //Ricava i due giocatori
        Giocatore g1 = null;
        Giocatore g2 = null;
        Iterator it = Monopoli.getMonopoliPartita().getGiocatore().iterator();
        while(it.hasNext()) {
                Giocatore gtmp = (Giocatore)it.next();
                if(gtmp.getId()==giocatore1)
                    g1=gtmp;
                if(gtmp.getId()==giocatore2)
                    g2=gtmp;
        }

        //Verifica se la somma è dovuta a me
        int giocatore = Monopoli.getMonopoliPartita().getGiocatoreSessione();
        if(giocatore == giocatore2) {
            Monopoli.getMonopoliGUI().appendInfoPlayer("IL GIOCATORE " + g1.getNome().toUpperCase() + " TI HA PAGATO " + amount + "€!");
            Banca b = Monopoli.getMonopoliPartita().getBanca();
            g2.setBanconote(b.sommaDenaro(g2.getBanconote(),b.ottieniSoldi(b.getBanconoteLista(), amount)));
            Monopoli.getMonopoliPartita().getGameToGUI().aggiornaSoldi();
        }
        else {
            Monopoli.getMonopoliGUI().appendInfoPlayer("IL GIOCATORE " + g1.getNome().toUpperCase() + " PAGATO " + amount + "€ A " + g2.getNome().toUpperCase());
        }
    }

    @Override
    public void comunicaRitiro () {
    }

    @Override
    public void comunicaIpoteca () {
    }

    @Override
    public void comunicaFinePartita () {
        
        Monopoli.getMonopoliGUI().appendInfoPlayer("GIOCO TERMINATO. FINE PARTITA...");

    }

    @Override
    public void comunicaAstaAvviata () {
    }

    @Override
    synchronized public void comunicaCadutaGiocatore (int idGiocatore) {

        Partita partita = Monopoli.getMonopoliPartita();

        ArrayList<Giocatore> giocatori = partita.getGiocatore();
        Iterator<Giocatore> gI = giocatori.iterator();
        Giocatore giocatoreCaduto = null;

        //Scorre nella lista dei giocatori finchè non trovo quello da rimuovere
        Boolean stop = false;
        int i = 0;
        while (gI.hasNext() && !stop) {
            Giocatore giocatore = gI.next();

            if (giocatore.getId() == idGiocatore) {
                giocatoreCaduto = giocatore;
                giocatori.remove(i);
                stop = true;
            }
            i++;
        }

        //Rimuovo elementi dal tabellone
        Tabellone tab = Monopoli.getMonopoliPartita().getTabellone();
        tab.rimuoviPedina(giocatoreCaduto.getPedina());
        Iterator it = giocatoreCaduto.getProprieta().iterator();
        Proprieta p=null;
        int ncase,nhotel;

        while(it.hasNext()) {
            p = (Proprieta)it.next();
            p.setProprietario(0);
            Casella c = tab.getCasella(p.getId()-1);
            if(c instanceof Terreno) {
                Terreno t = (Terreno)c;
                ncase = Monopoli.getMonopoliPartita().contaCase(t.getCostruzioni());
                nhotel = Monopoli.getMonopoliPartita().contaCase(t.getCostruzioni());
                while(ncase>0) {
                    ncase--;
                    tab.rimuoviCasa(c);
                }
                while(nhotel>0) {
                    nhotel--;
                    tab.rimuoviAlbergo(c);
                }
                
            }

        }


        
        //Aggiornamento dell'interfaccia grafica
        Monopoli.getMonopoliGUI().appendInfoPlayer("IL GIOCATORE " + giocatoreCaduto.getNome().toUpperCase() + " HA PERSO LA CONNESSIONE");
     }

    @Override
    public void comunicaMsg (String s) {
        Monopoli.getMonopoliGUI().appendInfoPlayer(s);
    }

    @Override
    public void asta () {
    }

    @Override
    public void avvenutoScambio () {
    }

    @Override
    public void richiestoScambio () {
    }

}

